﻿#ifndef BATTERYINFO_H
#define BATTERYINFO_H

#include <QObject>
#include <QAbstractTableModel>
class BatteryInfo{
public:
    //构造函数，初始化电池的名称、电压和平衡状态
    BatteryInfo(QString s,quint16 v,bool bal);

    //获取电池名称
    QString getName() const;
    void setName(const QString &value);

    //获取电压
    quint16 getV() const;
    void setV(quint16 value);

    //获取电池平衡状态
    bool getBal() const;
    void setBal(bool bal);

    //获取电池扫描状态
    bool getScan() const;
    void setScan(bool scan);

    //获取电池记录状态
    bool getRecord() const;
    void setRecord(bool record);

private:
    QString m_name;
    quint16 m_v;//电压
    bool m_bal;//平衡状态
    bool m_scan; //扫描
    bool m_record; //记录

};

class BatteryInfoModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    //定义枚举，用于数据访问和表示
    enum BatteryInfoRoles {
        nameRole = Qt::UserRole + 1, // 电池名称角色
        vRole, // 电池电压角色
        balRole, // 电池平衡状态角色
        recordRole, // 电池记录状态角色
        scanRole  // 电池扫描状态角色
     };

    //构造函数，接受一个父对象
    explicit BatteryInfoModel(QObject *parent = 0);
    // 添加一个新的BatteryInfo对象到模型
    Q_INVOKABLE void addBatteryInfo(const QString &name,const quint16 v,bool bal);
    // 清除模型中的所有BatteryInfo对象
    Q_INVOKABLE void clear();

    // 返回模型中的行数
    int rowCount(const QModelIndex & parent = QModelIndex()) const;
    // 返回模型中的列数
    int columnCount(const QModelIndex & parent = QModelIndex()) const;

    // 返回给定模型索引和角色的数据
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;

     // 设置给定模型索引和角色的数据
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) ;

    // 返回指定行和列的模型索引
    QModelIndex getIndex(int row,int col);

    //----------------------全记录
     Q_INVOKABLE void allRecord(bool value);
    //----------------------分记录
     Q_INVOKABLE void record(int index,bool value);

    //----------------------全扫描
    Q_INVOKABLE void allScan(bool value);
    //----------------------分扫描
    Q_INVOKABLE void scan(int index,bool value);

    //--------------是否记录和扫描
    bool getRecord(int index);
    bool getScan(int index);



signals:
    // 当所有电池信息的记录状态改变时发出信号
    void isAllRecord(bool value);
    // 当所有电池信息的扫描状态改变时发出信号
    void isAllScan(bool value);

public slots:
protected:
    // 返回一个哈希表，将自定义角色映射到角色名称
    QHash<int, QByteArray> roleNames() const;
private:
    // 电池信息列表
    QList<BatteryInfo> m_batteryInfo;

};

#endif // BATTERYINFO_H
